home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FishMarket 1.0
/
FishMarket v1.0.iso
/
fishies
/
626-637
/
disk_629
/
rexxrmf
/
rexxrmf.lzh
/
dumprmfdata.c
< prev
next >
Wrap
C/C++ Source or Header
|
1992-03-10
|
10KB
|
300 lines
/*-------------------------------------------------------------------------*
* *
* Prints formatted dump of data and index file. *
* Example of reading data and index files (if you must). *
* *
* Compiles under Manx C 5.0d *
* cc -hi allprecomp -pp -wnuq -o dumprmfdata.o dumprmfdata.c *
* ln -o dumprmfdata dumprmfdata.o -lc *
* *
* Compile/link for Lattice 5.10 *
* LC -L -Hinclude:allprecomp.q dumprmfdata *
* (pre-compiled header file) *
* *
*-------------------------------------------------------------------------*/
#include "avl.structs.h"
long getnum( void );
int dump_rmf_data_index( char *datafile, char *indexfile, long s, long e );
main( int argc, char *argv[] )
{
char *oldi,*oldd;
long oldnamelen,starting,ending;
if( argc < 2 ) {
printf("\nSyntax: %s 'filename' [startrecordnum] [endrecordnum]\n", \
argv[0]);
exit( 10 );
}
oldnamelen = strlen(argv[1]) + 50;
oldi = AllocMem( oldnamelen, MEMF_CLEAR );
oldd = AllocMem( oldnamelen, MEMF_CLEAR );
strcpy(oldd,argv[1]);
strcpy(oldi,argv[1]);
strcat(oldi,".rmfindex");
if( argc > 2 )
starting = atoi(argv[2]);
else {
printf("\n\nEnter Starting Record: ");
starting = getnum();
}
if( argc > 3 )
ending = atoi(argv[3]);
else {
printf("\n\nEnter Ending Record: ");
ending = getnum();
}
if( starting < 1 )
starting = 1;
if( !ending )
ending = 99999999L;
if( ending < starting )
ending = starting;
dump_rmf_data_index( oldi, oldd, starting, ending );
FreeMem( oldi, oldnamelen);
FreeMem( oldd, oldnamelen);
}
char numbuf[81];
long getnum()
{
long num;
gets(&numbuf[0]);
num = atoi(&numbuf[0]);
return(num);
}
int dump_rmf_data_index( char *indexfile, char *datafile, long start, long end )
{
struct IndexFile *ix;
struct DiskIndex *dtnode;
struct DataFileHeader *dfh;
struct RecordHeader *rh;
char *keybuf,*indxbuf;
char *datablock,*datapointer;
ULONG blocklen;
ULONG recaddr,recnum;
ULONG ifd,dfd;
long err,total_keylen,keyindex;
long blen,dlen,fieldnum;
int ok,i,j;
ifd = Open(indexfile,MODE_OLDFILE);
if( !ifd ) {
printf(" COULD NOT OPEN INDEX file %s\n",indexfile);
return( FALSE );
}
dfd = Open(datafile,MODE_OLDFILE);
if( !ifd ) {
printf(" COULD NOT OPEN DATA file %s\n",datafile);
Close( ifd );
return( FALSE );
}
ix = AllocMem( sizeof(struct IndexFile), MEMF_CLEAR );
dtnode = AllocMem( sizeof(struct DiskIndex), MEMF_CLEAR );
dfh = AllocMem( sizeof(struct DataFileHeader), MEMF_CLEAR );
rh = AllocMem( sizeof(struct RecordHeader), MEMF_CLEAR );
keybuf = AllocMem( (MAXKEYLEN) + 1, MEMF_CLEAR );
indxbuf = AllocMem( 5 * ((MAXKEYLEN) + 1), MEMF_CLEAR );
if( !keybuf || !rh || !ix || !dtnode || !dfh || !indxbuf ) {
printf("\nUnable to allocate memory\n\n");
if( ix )
FreeMem( ix, sizeof(struct IndexFile) );
if( dtnode )
FreeMem( dtnode, sizeof(struct DiskIndex) );
if( dfh )
FreeMem( dfh, sizeof(struct DataFileHeader) );
if( rh )
FreeMem( rh, sizeof(struct RecordHeader) );
if( keybuf )
FreeMem( keybuf, (MAXKEYLEN)+1 );
if( indxbuf )
FreeMem( indxbuf, (5 * ((MAXKEYLEN)+1)) );
Close( dfd );
Close( ifd );
return( FALSE );
}
ok = Read(ifd,ix,sizeof(struct IndexFile));
ok = Read(dfd,dfh,sizeof(struct DataFileHeader));
recnum = 0;
ok = TRUE;
printf("\n\n");
while( ok ) {
datablock = NULL;
/* fixed portion */
err = Read(ifd,dtnode,sizeof(struct DI_Info));
if( err <= 0 )
break;
total_keylen = 0;
for( i=0; i < MAXINDICES; i++ )
total_keylen = total_keylen + dtnode->di_info.keylen[i];
/* read variable key portion */
err = Read(ifd,&dtnode->keydata[0],total_keylen);
if( err <= 0 )
break;
switch( dtnode->di_info.recstatus )
{
case 'D': /* dont care, plus has no record length, dont know
how much to read in !
*/
break;
case 'A':
recaddr = dtnode->di_info.recaddr;
Seek(dfd,recaddr,OFFSET_BEGINNING);
err = Read( dfd, rh, sizeof(struct RecordHeader));
if( err <= 0 ) {
printf("READ ERROR occured at block %d\n",recaddr);
ok = FALSE;
break;
}
blocklen = rh->blocklength;
datablock = AllocMem( blocklen, MEMF_CLEAR );
if( !datablock ) {
printf(" Could not allocate mem for datablock\n");
printf(" blocklength was %-d\n",blocklen);
ok = FALSE;
break;
}
err = Read( dfd, datablock, (blocklen));
if( err <= 0 ) {
printf("READ ERROR occured at block %d\n",recaddr);
ok = FALSE;
break;
}
++recnum;
if( recnum >= start && recnum <= end ) {
printf(" RECORD #%-5d ",recnum);
printf(" AT LOCATION %-5d ",recaddr);
printf(" LENGTH %-5d ",rh->blocklength);
printf(" FIELDS %-4d\n",rh->numberoffields);
/* prime key as it is in index */
printf(" INDXKEY- ");
keyindex = 0;
for( i = 0; i <= MAXINDEXNUM; i++ ) {
for( j = 0; j < 10; j++ )
*(keybuf+j) = ' ';
*(keybuf+j) = '\0';
for(j = 0; j < dtnode->di_info.keylen[i]; j++) {
if( j < 9 )
*(keybuf+j) = dtnode->keydata[keyindex];
++keyindex;
}
if( i == 1 )
printf("\n ALTKEYS- ");
printf("%-d:%s",i,keybuf);
}
printf("\n");
/* prime key is first in block */
/* prime key as it is in datafile */
printf(" DATAKEY- %-10s\n ",datablock);
/* skip over key values */
blen = rh->dataoffset; /* strlen(datapointer); */
datapointer = datablock + blen;
fieldnum = 0;
while( blen < rh->recordlength ) {
dlen = strlen(datapointer);
if( !dlen ) /* means field is null length */
break; /* EOR trailer */
++fieldnum;
if( fieldnum == 1 )
printf("FIELDS - %03d:%-9.8s",fieldnum,datapointer);
else
printf("%03d:%-9.8s",fieldnum,datapointer);
if( !(fieldnum % 5) )
printf("\n ");
blen = blen + dlen + 1;
datapointer = (UBYTE *)((ULONG)datapointer + dlen + 1);
}
printf("\n\n\n");
if( datablock )
FreeMem( datablock,blocklen);
break;
}
}
}
Close( dfd );
Close( ifd );
FreeMem( ix, sizeof(struct IndexFile) );
FreeMem( dtnode, sizeof(struct DiskIndex) );
FreeMem( dfh, sizeof(struct DataFileHeader) );
FreeMem( rh, sizeof(struct RecordHeader) );
FreeMem( keybuf, ((MAXKEYLEN) + 1) );
FreeMem( indxbuf, (5 * ((MAXKEYLEN)+1)) );
return( !err );
}